/**
 * @description template service
 */

const WorksModel = require('../model/work')
const { findWorkList, updateWork, updateWorks, getWorksCount } = require('./works')

/**
 * 查询 作品/模板 列表
 * @param {object} whereOpt 查询条件
 * @param {object} pageOpt 分页数据
 */
async function findTemplateList(whereOpt = {}, pageOpt = {}) {
  const res = await findWorkList(
    {
      ...whereOpt,
      isTemplate: true // 是模板
    },
    pageOpt
  )
  return res
}

/**
 * 修改 作品/模板
 * @param {object} updateData 要修改的数据
 * @param {object} whereOpt 条件
 * @returns {Promise<boolean>} true/false
 */
async function updateTemplate(updateData = {}, whereOpt = {}) {
  const res = await updateWork(updateData, {
    ...whereOpt,
    isTemplate: true // 是模板
  })
  return res
}

/**
 * 批量修改 作品/模板
 * @param {object} updateData 要修改的数据
 * @param {object} whereOpt 条件
 */
async function updateTemplates(updateData = {}, whereOpt = {}) {
  const res = await updateWorks(updateData, {
    ...whereOpt,
    isTemplate: true // 是模板
  })
  return res
}

/**
 * 获取总数
 * @param {object} whereOpt 条件
 */
async function getTemplateCount(whereOpt = {}) {
  const res = await getWorksCount({
    ...whereOpt,
    isTemplate: true // 是模板
  })
  return res
}

/**
 * 获取使用次数的综合
 */
async function getCopiedCount() {
  const result = await WorksModel.aggregate([
    { $match: { isTemplate: true } }, // 执行完 $match 管道后，得到的查询结果会输入到 $group 管道
    { $group: { _id: 'copiedCount', copiedCount: { $sum: '$copiedCount' } } }
  ]).exec()
  return result
}

/**
 * 按月，统计创建数量
 * @param {Date} startTime 开始时间
 * @param {Date} endTime 结束时间
 */
// async function getCreatedCountMonthly(startTime, endTime) {
//   const result = await WorksModel.aggregate([
//     { $match: { isTemplate: true, latestPublishAt: { $gte: startTime, $lte: endTime } } }, // latestPublishAt >= startTime and latestPublishAt <= endTime
//     { $project: { month: { $dateToString: { format: '%Y-%m', date: '$latestPublishAt', timezone: '+08:00' } } } }, // 世界标准时间和我们时差相差8，我们是+8时区，所以+8小时就是系统当前时间
//     { $group: { _id: '$month', count: { $sum: 1 } } },
//     { $sort: { _id: 1 } }
//   ]).exec()
//   return result
// }

/**
 * 按月，统计创建数量和使用数量
 * @param {Date} startTime 开始时间
 * @param {Date} endTime 结束时间
 */
async function getCreatedAndCopiedCountMonthly(startTime, endTime) {
  const result = await WorksModel.aggregate([
    { $match: { isTemplate: true, latestPublishAt: { $gte: startTime, $lte: endTime } } }, // latestPublishAt >= startTime and latestPublishAt <= endTime
    {
      // 执行完 $project 管道，得到的结果格式为{ month, copiedCount }
      $project: {
        month: { $dateToString: { format: '%Y-%m', date: '$latestPublishAt', timezone: '+08:00' } }, // 世界标准时间和我们时差相差8，我们是+8时区，所以+8小时就是系统当前时间
        copiedCount: 1 // 设置原有 copiedCount 为 1，表示结果显示原有字段 copiedCount
      }
    },
    // $sum 计算总和  $avg 计算平均值  $min 获取最小值  $max 获取最大值  $first 获取第一个数据  $last  获取最后一个数据
    { $group: { _id: '$month', copiedCount: { $sum: '$copiedCount' }, count: { $sum: 1 } } }, // 按照 $month 进行分组（一组为1个月）
    { $sort: { _id: 1 } } // 得到的结果集按照 _id 升序排列；也就是按 $month 升序排序
  ]).exec()
  return result
}

module.exports = {
  findTemplateList,
  updateTemplate,
  updateTemplates,
  getTemplateCount,
  getCopiedCount,
  getCreatedAndCopiedCountMonthly
}
